//! 日志系统初始化
//! 
//! 
//! logs.rs
//! 
//! (RUST) alone
//! 
//! Create time: 2025-09-22		alone
//! Update time: 2025-09-25		alone
//! 

use std::{fs, path::PathBuf, sync::Mutex};

use once_cell::sync::OnceCell;
use tracing_appender::non_blocking::WorkerGuard;
use tracing_subscriber::{fmt::writer::MakeWriterExt, EnvFilter};

static INSTANCE: OnceCell<Mutex<Logger>> = OnceCell::new();

/// 日志记录
pub struct Logger 
{
	/// 日志文件目录
	_dir: PathBuf,
	/// 日志文件名称
	_file_name: String,
	/// WorkerGuard 是一个后台写入线程的守护句柄
	/// 如果丢弃（drop）这个 guard，后台日志写入线程会立即退出，可能导致日志丢失。
	/// 所以必须把它存储在一个长生命周期的位置（例如全局变量、struct 字段等）。
	_guard: WorkerGuard,
}

impl Logger 
{
	pub fn initialize(dir: PathBuf, file_name: String, level: String)
	{
		INSTANCE.get_or_init(|| 
		{
			if !dir.exists() {
				fs::create_dir(&dir).expect(
					&format!("Error: 创建日志目录 {} 失败。", dir.display()));
			}

			let file_path = dir.join(&file_name);
			let file = fs::File::create(&file_path).expect(
				&format!("Error: 创建日志文件 {} 失败。", file_path.display()));

			let (non_blocking, guard) = tracing_appender::non_blocking(file);
			let env_filter = EnvFilter::new(level);

			tracing_subscriber::fmt()
				.with_writer(non_blocking.and(std::io::stdout))
				.with_env_filter(env_filter)
				.with_thread_ids(true)
    			.with_thread_names(true)
				.with_line_number(true)
				.with_ansi(false)
				.init();

			println!("日志系统初始化成功, 日志路径输出路径 -> {:?}", file_path);

			Mutex::new(Logger 
			{
				_dir: dir,
				_file_name: file_name, 
				_guard: guard, 
			})
		});
	}
}